import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import { of } from 'rxjs/observable/of';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { catchError, tap } from 'rxjs/operators';
import { QuestionnaireModel, QuestionnaireState } from '../../shared/models/questionnaire.model';
import { QUESTIONNAIRE_URL } from '../../shared';

const httpOptions = {
  headers: new HttpHeaders({ 'Content-Type': 'application/json' })
};

@Injectable()
export class QuestionnaireService {
  constructor(private http: HttpClient) {}

  private handleError<T> (operation = 'operation', result?: T) {
    return (error: any): Observable<T> => {
      console.log(error);
      return of(result as T);
    };
  }

  // 根据id获取问卷信息
  getQuestionnaireById(id: number|string): Observable<QuestionnaireModel> {
    return this.http
      .get<QuestionnaireModel>( `${QUESTIONNAIRE_URL}/${id}`)
      .pipe(
        catchError(this.handleError<QuestionnaireModel>('getQuestionnaireById'))
      );
  }

  getQuestionnaires() {
    return this.http
      .get<QuestionnaireModel[]>(QUESTIONNAIRE_URL)
      .pipe(
        catchError(this.handleError('getQuestionnaires', []))
      );
  }

  // 添加新问卷
  addQuestionnaire(questionnaire: QuestionnaireModel): Observable<QuestionnaireModel> {
    return this.http
      .post<QuestionnaireModel>(QUESTIONNAIRE_URL, questionnaire, httpOptions)
      .pipe(
        // tslint:disable-next-line:no-shadowed-variable
        tap((questionnaire: QuestionnaireModel) => console.log(questionnaire) ),
        catchError(this.handleError<QuestionnaireModel>('addQuestionnaire'))
      );
  }

  // 删除已有问卷
  deleteQuestionnaire(questionnaire: QuestionnaireModel | number): Observable<QuestionnaireModel> {
    const id = typeof questionnaire === 'number' ? questionnaire : questionnaire.id;
    return this.http
      .delete<QuestionnaireModel>(`${QUESTIONNAIRE_URL}/${id}`)
      .pipe(
        tap(_ => console.log(`deleted questionnaire id = ${id}`)),
        catchError(this.handleError<QuestionnaireModel>('deleteQuestionnaire'))
      );
  }

  // 更新已有问卷
  updateQuestionnaire(questionnaire: QuestionnaireModel): Observable<any> {
    return this.http
      .put(QUESTIONNAIRE_URL, questionnaire, httpOptions)
      .pipe(
        tap(_ => console.log(`updateQuestionnaire `)),
        catchError(this.handleError<any>('updateQuestionnaire'))
      );
  }

  // 发布问卷
  // updateQuestionnaireState(id: string, state: QuestionnaireState) {
  //   return this.http
  //     .post('questionnaire/updateState', {id: id, state: state})
  //     .map((res: any) => <QuestionnaireModel>res.data)
  //     .catch(this.handleError);
  // }

  // 回收问卷
  reclaimQuestionnaire(questionnaire: QuestionnaireModel) {}
}

